package demo2;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

/**
 * @program: java-generic
 * @description:
 * @author: bjc
 * @create: 2021-08-15 15:02
 */
public class ProductGetter<T> {

    private T product;

    List<T> list = new ArrayList<T>();

    public void addProduct(T t){
        list.add(t);
    }

    public T getProduct(){
        return list.get(new Random().nextInt(list.size()));
    }

    /**
     * 泛型方法
     * @param list
     * @param <E> 泛型标识，具体类型，由调用方法的时候来指定
     *      这里的泛型标识和当前类的泛型标识无关  独立存在
     * @return
     */
    public <E> E getProduct(List<E> list){
        return list.get(new Random().nextInt(list.size()));
    }

    /**
     * 静态泛型方法，采用多个泛型类型
     * @param t
     * @param e
     * @param k
     * @param <T>
     * @param <E>
     * @param <K>
     */
    public static <T,E,K> void printType(T t,E e,K k){
        System.out.println(t+"\t"+t.getClass().getSimpleName());
        System.out.println(e+"\t"+e.getClass().getSimpleName());
        System.out.println(k+"\t"+k.getClass().getSimpleName());
    }

    /**
     * 泛型可变参数的定义
     * @param e
     * @param <E>
     */
    public static <E> void print(E... e){
        for (int i = 0; i < e.length; i++) {
            System.out.println(e[i]);
        }
    }
}

class Main{

    public static void main(String[] args) {
        ProductGetter<String> stringProductGetter = new ProductGetter<>();

        String[] strProducts = {"手机","电视","洗衣机"};
        for (int i = 0; i < strProducts.length; i++) {
            stringProductGetter.addProduct(strProducts[i]);
        }

        String product = stringProductGetter.getProduct();
        System.out.println("恭喜您抽中："+product);

        //测试泛型方法
        List<String> list = Arrays.asList("笔记本电脑", "蓝牙耳机", "平板电脑");
        String product1 = stringProductGetter.getProduct(list);
        System.out.println("奖品:"+product1);

        //测试静态泛型方法
        ProductGetter.printType(100,"java",true);

        //可变参数的泛型方法的调用
        ProductGetter.print(1,2,3);
    }
}
